const express = require('express');
const router = express.Router();
const MenuController = require('../controllers/menuController');
const { authenticateToken, requireAdmin } = require('../middleware/auth');
const { body, oneOf } = require('express-validator');
const { handleValidationErrors } = require('../middleware/validation');

// 菜单分类验证规则
const validateCategory = [
  body('name')
    .notEmpty()
    .withMessage('分类名称不能为空')
    .isLength({ max: 100 })
    .withMessage('分类名称不能超过100个字符'),
  body('name_en')
    .optional()
    .isLength({ max: 100 })
    .withMessage('英文名称不能超过100个字符'),
  body('description')
    .optional()
    .isLength({ max: 500 })
    .withMessage('描述不能超过500个字符'),
  body('description_en')
    .optional()
    .isLength({ max: 500 })
    .withMessage('英文描述不能超过500个字符'),
  body('icon')
    .optional()
    .isLength({ max: 255 })
    .withMessage('图标URL不能超过255个字符'),
  body('color')
    .optional()
    .matches(/^#[0-9A-Fa-f]{6}$/)
    .withMessage('颜色格式不正确'),
  body('is_active')
    .optional()
    .isBoolean()
    .withMessage('激活状态必须是布尔值'),
  body('sort_order')
    .optional()
    .isInt({ min: 0 })
    .withMessage('排序必须是非负整数'),
  handleValidationErrors
];

// 菜单项验证规则（适配 Admin 别名字段）
const validateMenuItem = [
  // 接受 category_id 或 category.value 其中之一
  oneOf([
    body('category_id').isInt({ min: 1 }),
    body('category.value').isInt({ min: 1 })
  ], '分类ID必须通过 category_id 或 category.value 提供，且为正整数'),

  body('name')
    .notEmpty()
    .withMessage('菜品名称不能为空')
    .isLength({ max: 100 })
    .withMessage('菜品名称不能超过100个字符'),
  body('name_en')
    .optional()
    .isLength({ max: 100 })
    .withMessage('英文名称不能超过100个字符'),
  body('description')
    .optional()
    .isLength({ max: 1000 })
    .withMessage('描述不能超过1000个字符'),
  body('description_en')
    .optional()
    .isLength({ max: 1000 })
    .withMessage('英文描述不能超过1000个字符'),
  body('price')
    .isFloat({ min: 0 })
    .withMessage('价格必须是非负数'),
  // 支持 original_price 与 Admin 的 originalPrice
  body('original_price')
    .optional()
    .isFloat({ min: 0 })
    .withMessage('原价必须是非负数'),
  body('originalPrice')
    .optional()
    .isFloat({ min: 0 })
    .withMessage('原价必须是非负数'),

  // 支持 image_url 与 Admin 的 imageUrl
  body('image_url')
    .optional()
    .isLength({ max: 500 })
    .withMessage('图片URL不能超过500个字符'),
  body('imageUrl')
    .optional()
    .isLength({ max: 500 })
    .withMessage('图片URL不能超过500个字符'),
  // 前端字段：image（字符串，如Base64或文件名占位）
  body('image')
    .optional()
    .isString()
    .withMessage('图片内容必须是字符串'),

  body('ingredients')
    .optional()
    .custom(value => {
      if (typeof value === 'string') return value.length <= 1000;
      if (value && typeof value === 'object') return JSON.stringify(value).length <= 5000;
      return false;
    })
    .withMessage('配料信息必须是字符串(≤1000)或对象/数组(JSON后≤5000字节)'),
  body('allergens')
    .optional()
    .custom(value => {
      if (typeof value === 'string') return value.length <= 500;
      if (value && typeof value === 'object') return JSON.stringify(value).length <= 2000;
      return false;
    })
    .withMessage('过敏原信息必须是字符串(≤500)或对象/数组(JSON后≤2000字节)'),
  body('nutritional_info')
    .optional()
    .custom(value => {
      if (typeof value === 'string') return value.length <= 1000;
      if (value && typeof value === 'object') return JSON.stringify(value).length <= 5000;
      return false;
    })
    .withMessage('营养信息必须是字符串(≤1000)或对象/数组(JSON后≤5000字节)'),
  body('tags')
    .optional()
    .custom(value => {
      if (Array.isArray(value)) return value.length <= 50 && value.every(v => typeof v === 'string' && v.length <= 50);
      if (typeof value === 'string') return value.length <= 500;
      if (value && typeof value === 'object') return JSON.stringify(value).length <= 2000;
      return false;
    })
    .withMessage('标签必须是字符串(≤500)或字符串数组(每项≤50，最多50项)'),
  body('spice_level')
    .optional()
    .isInt({ min: 0, max: 5 })
    .withMessage('辣度等级必须是0-5之间的整数'),
  body('preparation_time')
    .optional()
    .isInt({ min: 0 })
    .withMessage('制作时间必须是非负整数'),
  body('calories')
    .optional()
    .isInt({ min: 0 })
    .withMessage('卡路里必须是非负整数'),
  body('is_available')
    .optional()
    .isBoolean()
    .withMessage('可用状态必须是布尔值'),
  body('is_recommended')
    .optional()
    .isBoolean()
    .withMessage('推荐状态必须是布尔值'),
  body('is_spicy')
    .optional()
    .isBoolean()
    .withMessage('辣味标识必须是布尔值'),
  body('is_vegetarian')
    .optional()
    .isBoolean()
    .withMessage('素食标识必须是布尔值'),
  body('is_vegan')
    .optional()
    .isBoolean()
    .withMessage('纯素标识必须是布尔值'),

  // Admin 扩展字段（写入 tags._admin）
  body('status.hidden')
    .optional()
    .isBoolean()
    .withMessage('隐藏状态必须是布尔值'),
  body('stock')
    .optional()
    .isInt({ min: 0 })
    .withMessage('库存必须是非负整数'),
  body('isHot')
    .optional()
    .isBoolean()
    .withMessage('热门标识必须是布尔值'),
  body('isNew')
    .optional()
    .isBoolean()
    .withMessage('新品标识必须是布尔值'),

  body('sort_order')
    .optional()
    .isInt({ min: 0 })
    .withMessage('排序必须是非负整数'),
  handleValidationErrors
];

// 标记弃用字段（后向兼容）：若请求包含旧字段，则通过响应头返回提示
const markDeprecatedFields = (req, res, next) => {
  try {
    const deprecated = [];
    if (Object.prototype.hasOwnProperty.call(req.body, 'category_id')) {
      deprecated.push('category_id -> 请使用 category.value');
    }
    if (Object.prototype.hasOwnProperty.call(req.body, 'original_price')) {
      deprecated.push('original_price -> 请使用 originalPrice');
    }
    if (Object.prototype.hasOwnProperty.call(req.body, 'image_url')) {
      deprecated.push('image_url -> 请使用 imageUrl');
    }
    if (deprecated.length) {
      res.setHeader('X-Deprecated-Fields', deprecated.join(', '));
    }
  } catch (_) {}
  return next();
};

// 公开路由 - 获取菜单信息
router.get('/public/categories', MenuController.getCategories);
router.get('/public/categories/with-count', MenuController.getCategoriesWithCount);
router.get('/public/items', MenuController.getMenuItems);
router.get('/public/items/search', MenuController.searchMenuItems);  // 必须在 /items/:id 之前
router.get('/public/items/category/:categoryId', MenuController.getMenuItemsByCategory);
router.get('/public/items/:id', MenuController.getMenuItem);
router.get('/public/popular', MenuController.getPopularItems);
router.get('/public/recommended', MenuController.getRecommendedItems);
router.get('/public/full-menu', MenuController.getFullMenu);

// 需要认证的路由
router.use(authenticateToken);

// 认证后可访问的菜单路由
router.get('/categories', MenuController.getCategories);
router.get('/categories/with-count', MenuController.getCategoriesWithCount);
router.get('/items', MenuController.getMenuItems);
router.get('/items/search', MenuController.searchMenuItems);  // 必须在 /items/:id 之前
router.get('/items/category/:categoryId', MenuController.getMenuItemsByCategory);
router.get('/items/:id', MenuController.getMenuItem);
router.get('/popular', MenuController.getPopularItems);
router.get('/recommended', MenuController.getRecommendedItems);
router.get('/full-menu', MenuController.getFullMenu);

// 管理员路由 - 菜单分类管理
router.put('/categories/sort', requireAdmin, MenuController.updateCategoriesSort);
router.post('/categories', requireAdmin, validateCategory, MenuController.createCategory);
router.put('/categories/:id', requireAdmin, validateCategory, MenuController.updateCategory);
router.delete('/categories/:id', requireAdmin, MenuController.deleteCategory);

// 管理员路由 - 菜单项管理
router.put('/items/sort', requireAdmin, MenuController.updateMenuItemsSort);
router.post('/items', requireAdmin, validateMenuItem, markDeprecatedFields, MenuController.createMenuItem);
router.put('/items/:id', requireAdmin, validateMenuItem, markDeprecatedFields, MenuController.updateMenuItem);
router.delete('/items/:id', requireAdmin, MenuController.deleteMenuItem);
router.put('/items/:id/availability', requireAdmin, MenuController.updateAvailability);
router.post('/items/:id/image', requireAdmin, MenuController.uploadItemImage);

// 临时端点：批量清空旧的image_url字段
router.post('/items/clear-old-images', requireAdmin, MenuController.clearOldImageUrls);

module.exports = router;